package org.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
import org.rabbitmq.config.MqConfig;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Todo: 消费者服务
 *
 * @Author: hjc_042043@sina.cn
 * @Date: 2024/1/30 01:37
 */
public class Consumer {
    public static void main(String[] args) {
        System.out.println("消费者");

        //创建连接工厂
        ConnectionFactory connFactory = new ConnectionFactory();
        //设置host
        connFactory.setHost(MqConfig.HOST);
        //设置端口，默认是5672
        connFactory.setPort(MqConfig.PORT);
        //为用户分配虚拟主机，默认为/
        connFactory.setVirtualHost("/");
        //设置用户名
        connFactory.setUsername(MqConfig.USER_NAME);
        //设置密码
        connFactory.setPassword(MqConfig.PASSWORD);

        try(//创建连接和通道
            Connection connection = connFactory.newConnection();
            Channel channel = connection.createChannel()) {
            //在这里也声明队列，因为可能生产者还没有创建队列，消费者嫌弃懂了服务
            channel.queueDeclare(MqConfig.SIMPLE_QUEUE_NAME, false, false, false, null);
            System.out.println("[wait] 等待被消费，想要退出，就Ctrl+C");

            /*
             *todo 这里类似于多线程的run方法，一般属于就绪状态，直到监听到消息，就去获取消息
             *todo 监听服务器，将队列中的消息传递给回调方法，它将异步地向我们推送消息
             *todo 所以我们以对象的形式提供了一个回调，该回调将缓冲消息，直到我们准备好使用它们。这就是DeliverCallback子类所做的。
             */
            DeliverCallback deliverCallback = (consumerTag, delivery) -> {
                //将消息的字节数组转成字符串
//                String message = delivery.getBody().toString();
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println("[生产者] 接收消息：" + message);
            };
            //开始启动消费服务
            channel.basicConsume(MqConfig.SIMPLE_QUEUE_NAME, true, deliverCallback, consumerTag -> {
            });
        } catch (IOException | TimeoutException e) {
            throw new RuntimeException(e);
        }
    }
}
